home *** CD-ROM | disk | FTP | other *** search
/ Input 64 / Input_64_87-09_1987_Verlag_Heinz_Weise_de.d64 / ici 2 < prev    next >
Text File  |  2023-02-26  |  5KB  |  133 lines

  1. org $9000
  2.  
  3. ; erweiterung fuer ici - move kommando
  4. ; (w) frank boerncke   (c) input64
  5.  
  6. ; arbeitsvariablen fuer move-routine
  7.  
  8. :w1=$57
  9. :w2=$58
  10. :w3=$59
  11. :w4=$5a
  12.  
  13. ; ruecksprungadresse
  14.  
  15. :backici = $c17f
  16.  
  17. ; systempuffer
  18.  
  19. :inkbuf = 679       ;input-string
  20. :tmpbuf = inkbuf+39 ;befehlsstrings
  21.  
  22. ; konstanten von ici
  23.  
  24. :dnum   = $cda9  ;  aktuelle geraeteadresse
  25. :echo   = $cdaa  ;  echomodus an/aus
  26. :fstat  = $cdab  ;  file gerade offen?
  27. :copyn  = $cdac  ;  anzahl laufwerke bei pip
  28. :sek    = $cdad  ;  lademodus
  29. :mcom   = $cdae  ;  noch ein kommando in der zeile?
  30. :batchm = $cdaf  ;  batchmodus an/aus
  31. :cbatl  = $cdb0  ;  zeiger auf aktuelles ...
  32. :cbath  = $cdb1  ;  ... kommando im batchpuffer
  33. :bathl  = $cdb2  ;  batchpuffer  ende-low
  34. :bathh  = $cdb3  ;  ende-high
  35. :batll  = $cdb4  ;  anfang-low
  36. :batlh  = $cdb5  ;  anfang-high
  37. :icihl  = $cdb6  ;  icipuffer  ende-low
  38. :icihh  = $cdb7  ;  ende-high
  39. :icill  = $cdb8  ;  anfang-low
  40. :icilh  = $cdb9  ;  anfang-high
  41. :adrl   = $cdba  ;  16-bit-wert low-byte
  42. :adrh   = $cdbb  ;  high-byte
  43.  
  44. ; routinen der ici-sprungleiste
  45.  
  46. :inkey  = $cdc1  ; string holen
  47. :strout = $cdc4  ; string ausgeben
  48. :print  = $cdc7  ; zeichen ausgeben
  49. :decode = $cdca  ; vektor in interpreterschleife
  50. :fopen  = $cdcd  ; datei auf diskette oeffnen
  51. :fclose = $cdd0  ; datei schliessen
  52. :status = $cdd3  ; fehlerkanal ausgeben
  53. :device = $cdd6  ; laufwerk angeschlossen?
  54. :echon  = $cdd9  ; echomodus anschalten
  55. :echof  = $cddc  ; echomodus abschalten
  56. :dos    = $cddf  ; befehlsstrings senden
  57. :basc   = $cde2  ; bildschirmcode in ascii wandeln
  58. :hexout = $cde5  ; hexadezimalzahl ausgeben
  59. :ghexn  = $cde8  ; 4-bit hexwert holen
  60. :ghexw  = $cdeb  ; 16-bit hexwert holen
  61. :ghexb  = $cdee  ; 8-bit hexwert holen
  62. :filt   = $cdf1  ; steuerzeichen ausfiltern
  63. :error  = $cdf4  ; fehlermeldung ausgeben
  64. :nxtcom = $cdf7  ; leerzeichen ueberlesen
  65.  
  66.  
  67. ; routine durch vektor newcom in ici einbinden
  68. ; init darf nur einmal aufgerufen werden
  69.  
  70. :init    lda decode+1 ; das alte ziel von
  71.          ldy decode+2 ; decode dient jetzt
  72.          sta end+1    ; als rucksprungadresse
  73.          sty end+2    ; fuer die eigene routine
  74.          lda #<newcom ; der vektor decode
  75.          sta decode+1 ; zeigt ab jetzt
  76.          lda #>newcom ; auf die eigene
  77.          sta decode+2 ; decodierroutinen
  78.          rts          ; zurueck zu basic
  79.  
  80. ; test, ob die naechste zeichenfolge = move ist
  81.  
  82. :newcom  ldy #$ff     ; zaehler initialisieren
  83. :search  iny          ; zaehler erhoehen
  84.          lda (w1),y   ; naechstes zeichen holen
  85.          beq execute  ; bei stringende wird in die eigene
  86.          cmp #32      ; routine verzweigt. dieser fall wird
  87.          beq execute  ; durch space oder 0 angezeigt
  88.          cmp comtab,y ; mit zeichen aus tabelle vergleichen
  89.          beq search   ; wenn gleich dann weitervergleichen
  90. :end     jmp $ffff    ; kommando wurde nicht erkannt.
  91.                       ; zurueck zur normalen decodierung
  92.                       ; $ffff wird durch init gesetzt
  93. :comtab b"move",0     ; neuer kommandoname
  94.  
  95. ; zeiger und adressen setzen
  96.  
  97. :execute tya          ; vektor w1/w2 so hochsetzen,
  98.          clc          ; dass er auf das zeichen
  99.          adc w1       ; hinter dem kommando 'move'
  100.          sta w1       ; in dem eingabepuffer zeigt.
  101.          lda #0       ; dazu wird die kommandolaenge
  102.          adc w2       ; einfach zum vektor addiert.
  103.          sta w2       ; ( 16-bit addition )
  104.          lda w1       ; der zeiger (w1/w2) wird auf
  105.          pha          ; dem stack gesichert, weil er
  106.          lda w2       ; fuer die weitere abarbeitung
  107.          pha          ; der aktuellen zeile wichtig ist
  108.          lda #13      ; erzeugt einen zeilenvorschub auf
  109.          jsr print    ; dem bildschirm.
  110.          lda #0       ; mcom = 0 zeigt an, dass nur noch
  111.          sta mcom     ; parameter folgen aber kein kommando
  112.  
  113. ; ab hier die eigentliche routine
  114.  
  115. :move    jsr nxtcom   ; leerzeichen ueberlesen
  116.          jsr ghexw    ; 2-byte hexzahl nach w3/w4 schreiben
  117.          ldy #0       ; den wert auslesen, auf den der
  118.          lda (w3),y   ; vektor (w3/w4) zeigt und ihn dann
  119.          pha          ; auf dem stack zwischenlagern.
  120.          jsr nxtcom   ; leerzeichen ueberlesen
  121.          jsr ghexw    ; 2-byte hexzahl nach w3/w4 schreiben
  122.          ldy #0       ; den wert auslesen, auf den der
  123.          lda (w3),y   ; vektor (w3/w4) zeigt und ihn dann
  124.          tax          ; adresse low-byte nach x-register
  125.          iny          ; adresse+1
  126.          lda (w3),y   ; adresse high-byte auslesen
  127.          stx w3       ; adresse nach w3/w4
  128.          sta w4       ;
  129.          pla          ; zwischengelagerten wert holen...
  130.          dey          ; ... und in die angegebene
  131.          sta (w3),y   ; adresse hineinschreiben.
  132.          jmp backici  ; ruecksprung zu ici
  133.  
  134.  
  135.